package org.application.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.application.Entity.Piece;
import org.application.service.MoveValidator;

import java.util.Map;


@Slf4j
public class RookMoveValidator implements MoveValidator {
    @Override
    public boolean validateMove(Map<String, Piece> pieceMap, Piece selectedPiece, int selectedRow, int selectedCol, int targetRow, int targetCol) {
        // 车只能沿着直线（水平或垂直）移动
        if (selectedRow != targetRow && selectedCol != targetCol) {
            log.warn("车只能在直线方向上移动，不能斜着走");
            return false; // 如果车的移动不是沿着直线，返回 false，表示不合法的移动
        }

        // 检查车在水平移动时是否有障碍
        if (selectedRow == targetRow) {
            return !isPathBlockedHorizontally(pieceMap,selectedRow, selectedCol, targetCol);
        }

        // 检查车在垂直移动时是否有障碍
        if (selectedCol == targetCol) {
            return !isPathBlockedVertically(pieceMap,selectedCol, selectedRow, targetRow);
        }

        return true;
    }


    // 水平路径检查
    private boolean isPathBlockedHorizontally(Map<String, Piece> pieceMap, int row, int startCol, int targetCol) {
        int minCol = Math.min(startCol, targetCol);
        int maxCol = Math.max(startCol, targetCol);
        // 检查startCol和targetCol之间的格子
        for (int col = minCol + 1; col < maxCol; col++) {
            String key = row + "," + col;
            if (pieceMap.containsKey(key) && !pieceMap.get(key).isCaptured()) {
                Piece piece = pieceMap.get(key); // 获取路径上挡住的棋子
                log.warn("车的水平移动路径上有棋子挡住: ({}, {}), 被挡住的棋子是: {} ",
                        row, col, piece); // 记录被挡住的棋子信息
                return true; // 如果路径上有棋子挡住，返回 true
            }
        }
        return false; // 如果没有障碍物，返回 false
    }

    // 垂直路径检查
    private boolean isPathBlockedVertically(Map<String, Piece> pieceMap, int col, int startRow, int targetRow) {
        int minRow = Math.min(startRow, targetRow);
        int maxRow = Math.max(startRow, targetRow);
        // 检查startRow和targetRow之间的格子
        for (int row = minRow + 1; row < maxRow; row++) {
            String key = row + "," + col;
            if (pieceMap.containsKey(key) && !pieceMap.get(key).isCaptured()) {
                Piece piece = pieceMap.get(key); // 获取路径上挡住的棋子
                log.warn("车的垂直移动路径上有棋子挡住: ({}, {}), 被挡住的棋子是: {}",
                        row, col, piece); // 记录被挡住的棋子信息
                return true; // 如果路径上有棋子挡住，返回 true
            }
        }
        return false; // 如果没有障碍物，返回 false
    }


}
